#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <sstream>

int main(int argc, char* argv[]) {
	// Falta el archivo
	if( argc < 5 ) {
		printf("1) Modo\n2) Output valido\n3) Cantidad instancias\n4) Tope carga de camion\n");
		return -1; 
	}

	// Abro el archivo
	int modo = atoi(argv[1]);
	const char* archivoOut = argv[2];
	int end = atoi(argv[3]);
	int maxCargaCamion = atoi(argv[4]);
	
	printf("Generando\n");
	srand(time(NULL));
	
	FILE* archivo = fopen(archivoOut, "a" );
	bool salir = false;

	for(int j=1; j <= end; j++) {
		if (salir)
			break;
		
		int cantPaq = j;
		int cantMax = rand() % (maxCargaCamion-j) + j;
		int paquete;
		int pivote;
		int tope = cantMax / cantPaq;
		if (tope == 0) {
			tope = 1;
		}

		switch(modo) {
			case 1:
				// CASO PROMEDIO -----------------------------------------------------				
				fprintf(archivo, "%i ", cantMax);
				fprintf(archivo, "%i ", cantPaq);
				
				for (int i=0; i < cantPaq; i++) {
					paquete = rand() % cantMax+1;
					fprintf(archivo, "%i ", paquete);
				}
				
				fprintf(archivo, "\n");
				break;

			case 2:
				// CASO ASCENDENTE ---------------------------------------------------
				pivote = 1;
				
				fprintf(archivo, "%i ", cantMax);
				fprintf(archivo, "%i ", cantPaq);
				
				for (int i=0; i < cantPaq; i++) {
					paquete = rand() % tope+1;
					paquete = pivote + paquete;
					if (paquete > cantMax) {
						paquete = cantMax;
					}
					pivote = paquete;
					fprintf(archivo, "%i ", paquete);
				}
				
				fprintf(archivo, "\n");
				break;

			case 3:
				// CASO DESCENDENTE --------------------------------------------------
				pivote = cantMax;
				
				fprintf(archivo, "%i ", cantMax);
				fprintf(archivo, "%i ", cantPaq);
				
				for (int i=0; i < cantPaq; i++) {
					paquete = rand() % tope+1;
					paquete = pivote - paquete;
					if (paquete < 1) {
						paquete = 1;
					}
					pivote = paquete;
					fprintf(archivo, "%i ", paquete);
				}
				
				fprintf(archivo, "\n");
				break;

			case 4:
				// CASO PAQUETES MAXIMOS ---------------------------------------------
				paquete = cantMax;

				fprintf(archivo, "%i ", cantMax);
				fprintf(archivo, "%i ", cantPaq);

				for (int i=0; i < cantPaq; i++) {
					fprintf(archivo, "%i ", paquete);
				}
				
				fprintf(archivo, "\n");
				break;

			default:
				printf("Modos: 1) promedio, 2) ascendente, 3) descendente o 4) paquetes maximos\n");
				salir = true;
				break;
		}
	}
	
	fprintf(archivo, "#");
	
	fclose(archivo);
	
	printf("Archivo generado\n");
	return 0;
}


